Show an error messager for invalid semver spec for packages in the [replace] section.
authorJuan Hernández <juan.hernandez.babon@gmail.com>
Fri, 30 Sep 2016 11:27:10 +0000 (13:27 +0200)
committerJuan Hernández <juan.hernandez.babon@gmail.com>
Fri, 30 Sep 2016 11:27:10 +0000 (13:27 +0200)
The [replace] section in the Cargo.toml file doesn't allow invalid semver specs
for packages, so something like this:

    [dependencies]
    foo = "*"

    [replace]
    "foo:*" = { git = 'https://example.com' }

It's not valid. In this case we will display an error message like this:

    error: failed to parse manifest at `Cargo.toml`

    Caused by:
      replacements must specify a valid semver version to replace, but `foo:*` does not

src/cargo/core/package_id_spec.rs
src/cargo/util/toml.rs
tests/overrides.rs

index 031249393661f20fbc11cca166a48609179b01d3..3299ada5738c9c4a6870e30584e5efbfc292d73f 100644 (file)
@@ -257,6 +257,7 @@ mod tests {
     #[test]
     fn bad_parsing() {
         assert!(PackageIdSpec::parse("baz:").is_err());
+        assert!(PackageIdSpec::parse("baz:*").is_err());
         assert!(PackageIdSpec::parse("baz:1.0").is_err());
         assert!(PackageIdSpec::parse("http://baz:1.0").is_err());
         assert!(PackageIdSpec::parse("http://#baz:1.0").is_err());
index ac94d3a2837e157d33ab1cf6d374e20aedbfe0ac..578d447432730f2f65eb68f0823a892676349564 100644 (file)
@@ -737,7 +737,12 @@ impl TomlManifest {
                -> CargoResult<Vec<(PackageIdSpec, Dependency)>> {
         let mut replace = Vec::new();
         for (spec, replacement) in self.replace.iter().flat_map(|x| x) {
-            let spec = try!(PackageIdSpec::parse(spec));
+            let spec = match PackageIdSpec::parse(spec) {
+                Ok(spec) => spec,
+                Err(_)   => bail!("replacements must specify a \
+                                   valid semver version \
+                                   to replace, but `{}` does not", spec),
+            };
 
             let version_specified = match *replacement {
                 TomlDependency::Detailed(ref d) => d.version.is_some(),
index 5eebed0bfa134785a074548213627c07e30934e4..eff9bbf9d85566fb598a2e014a8d05dcee3dd498 100644 (file)
@@ -77,6 +77,32 @@ Caused by:
 "));
 }
 
+#[test]
+fn invalid_semver_version() {
+    let p = project("local")
+        .file("Cargo.toml", r#"
+            [package]
+            name = "local"
+            version = "0.0.1"
+            authors = []
+
+            [dependencies]
+            foo = "*"
+
+            [replace]
+            "foo:*" = { git = 'https://example.com' }
+        "#)
+        .file("src/lib.rs", "");
+
+    assert_that(p.cargo_process("build"),
+                execs().with_status(101).with_stderr("\
+error: failed to parse manifest at `[..]`
+
+Caused by:
+  replacements must specify a valid semver version to replace, but `foo:*` does not
+"));
+}
+
 #[test]
 fn different_version() {
     Package::new("foo", "0.2.0").publish();